<?php

namespace System\Loader;

/**
 * 命名空间别名类
 * 
 * @package Dream
 * @subpackage ClassAlias
 * @namespace System\Loader
 * @author lewis (lewisld@yeah.net)
 */
class SpaceAlias
{

    /**
     * 所有命名空间别名
     * 
     * @static
     *
     * @access protected
     * @var array
     */
    protected static $spaceList = [];

    /**
     * 注册命名空间别名
     * 
     * @static
     *
     * @access public
     * @param string|array $alias 命名空间别名名称，可以是字符串或数组
     * @param string $path 命名空间别名指向的命名空间
     * @return boolean 成功就返回 “true”，否则返回 “false”
     */
    public static function registerSpace($alias, $space = '')
    {
        if (is_array($alias)) {
            foreach ($alias as $key => $value) {
                if (NULL != $value) {
                    $key = preg_replace('/\/+/', '.', str_replace('\\', '/', $key));
                    $value = preg_replace('/\/+/', '.', str_replace('\\', '/', $value));
                    self::$spaceList[$key] = (string) PathAlias::getPath($value);
                }
            }
            
            return TRUE;
        } else {
            if (NULL != $space) {
                $alias = preg_replace('/\/+/', '.', str_replace('\\', '/', $alias));
                $space = preg_replace('/\/+/', '.', str_replace('\\', '/', $space));
                self::$spaceList[$alias] = (string) PathAlias::getPath($space);
                
                return TRUE;
            }
        }
        unset($key, $value, $alias, $space);
        
        return FALSE;
    }

    /**
     * 获取命名空间别名
     * 
     * @static
     *
     * @access public
     * @param string $alias 命名空间别名
     * @return string|boolean
     */
    public static function getSpace($alias)
    {
        $alias = preg_replace('/\/+/', '.', str_replace('\\', '/', $alias));
        $arr = explode(DS, $alias);
        $name = [];
        $count = count($arr) - 1;
        for ($i = 0; $i < $count; $i ++) {
            $name[] = DS . array_pop($arr);
            $str = implode('.', $arr);
            if (isset(self::$spaceList[$str])) {
                unset($alias, $arr, $name, $count, $str);
                
                return self::$spaceList[$str] . DS . implode(DS, array_reverse($name));
            }
        }
        unset($alias, $arr, $name, $count, $str);
        
        return $alias;
    }

    /**
     * 获取所有命名空间别名
     * 
     * @static
     *
     * @access public
     * @return array 返回所有命名空间别名数组
     */
    public static function getAllSpaceAlias()
    {
        return self::$spaceList;
    }
}
